From: Florian Müllner Date: Fri, 10 Feb 2017 13:14:14 +0000 (+0100) Subject: status: Add nightLight indicator X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~1013^2^2~540 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=785c8137710b4b99c806eb485ebf9fc8f3e1b34c;p=gnome-shell.git status: Add nightLight indicator The display configuration now exposes a setting to automatically shift the display color at nighttime. As there are cases where disabling the filtering temporarily is useful, it makes sense to expose the feature in the system menu for quick access. https://bugzilla.gnome.org/show_bug.cgi?id=741224 --- diff --git a/js/js-resources.gresource.xml b/js/js-resources.gresource.xml index 58f433c3c..72cc4f875 100644 --- a/js/js-resources.gresource.xml +++ b/js/js-resources.gresource.xml @@ -117,6 +117,7 @@ ui/status/brightness.js ui/status/location.js ui/status/keyboard.js + ui/status/nightLight.js ui/status/network.js ui/status/power.js ui/status/rfkill.js diff --git a/js/ui/panel.js b/js/ui/panel.js index aad466df7..fe3fc392f 100644 --- a/js/ui/panel.js +++ b/js/ui/panel.js @@ -719,9 +719,11 @@ const AggregateMenu = new Lang.Class({ this._system = new imports.ui.status.system.Indicator(); this._screencast = new imports.ui.status.screencast.Indicator(); this._location = new imports.ui.status.location.Indicator(); + this._nightLight = new imports.ui.status.nightLight.Indicator(); this._indicators.add_child(this._screencast.indicators); this._indicators.add_child(this._location.indicators); + this._indicators.add_child(this._nightLight.indicators); if (this._network) { this._indicators.add_child(this._network.indicators); } @@ -745,6 +747,7 @@ const AggregateMenu = new Lang.Class({ this.menu.addMenuItem(this._location.menu); this.menu.addMenuItem(this._rfkill.menu); this.menu.addMenuItem(this._power.menu); + this.menu.addMenuItem(this._nightLight.menu); this.menu.addMenuItem(this._system.menu); menuLayout.addSizeChild(this._location.menu.actor); diff --git a/js/ui/status/nightLight.js b/js/ui/status/nightLight.js new file mode 100644 index 000000000..b97710ccf --- /dev/null +++ b/js/ui/status/nightLight.js @@ -0,0 +1,74 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const Gio = imports.gi.Gio; +const Lang = imports.lang; + +const Main = imports.ui.main; +const PanelMenu = imports.ui.panelMenu; +const PopupMenu = imports.ui.popupMenu; + +const BUS_NAME = 'org.gnome.SettingsDaemon.Color'; +const OBJECT_PATH = '/org/gnome/SettingsDaemon/Color'; + +const ColorInterface = ' \ + \ + \ + \ + \ +'; + +const ColorProxy = Gio.DBusProxy.makeProxyWrapper(ColorInterface); + +const Indicator = new Lang.Class({ + Name: 'NightLightIndicator', + Extends: PanelMenu.SystemIndicator, + + _init: function() { + this.parent(); + + this._indicator = this._addIndicator(); + this._indicator.icon_name = 'night-light-symbolic'; + this._proxy = new ColorProxy(Gio.DBus.session, BUS_NAME, OBJECT_PATH, + (proxy, error) => { + if (error) { + log(error.message); + return; + } + this._proxy.connect('g-properties-changed', + Lang.bind(this, this._sync)); + this._sync(); + }); + + this._item = new PopupMenu.PopupSubMenuMenuItem("", true); + this._item.icon.icon_name = 'night-light-symbolic'; + this._disableItem = this._item.menu.addAction('', () => { + this._proxy.DisabledUntilTomorrow = !this._proxy.DisabledUntilTomorrow; + }); + this._item.menu.addAction(_("Turn Off"), () => { + let settings = new Gio.Settings({ schema_id: 'org.gnome.settings-daemon.plugins.color' }); + settings.set_boolean('night-light-enabled', false); + }); + this._item.menu.addSettingsAction(_("Display Settings"), 'gnome-display-panel.desktop'); + this.menu.addMenuItem(this._item); + + Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated)); + this._sessionUpdated(); + this._sync(); + }, + + _sessionUpdated: function() { + let sensitive = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter; + this.menu.setSensitive(sensitive); + }, + + _sync: function() { + let visible = this._proxy.NightLightActive; + let disabled = this._proxy.DisabledUntilTomorrow; + + this._item.label.text = disabled ? _("Night Light Disabled") + : _("Night Light On"); + this._disableItem.label.text = disabled ? _("Resume") + : _("Disable Until Tomorrow"); + this._item.actor.visible = this._indicator.visible = visible; + } +});